#include <iostream>
#include <random>
#include <sstream>
#include <atomic>
#include <iomanip>
static std::string uuid()
{
    std::random_device rd;
    size_t num = rd(); // 生成机器随机数, 效率较低
    // 通过机器随机数作为生成伪随机数种子,
    std::mt19937_64 gernator(rd());
    // 限制数字范围
    std::uniform_int_distribution<int> distribution(0, 255);
    // 将生成的数转化为16进制的数字
    std::stringstream ss; // ss << std::hex 设置流状态, 将数字格式化为16进制
    // ss << std::setw(2) << std::setfill('0'); // 位宽设置为2, 不足2位填充0
    // ss << std::hex << distribution(gernator);
    for (int i = 0; i < 8; i++)
    {
        ss << std::setw(2) << std::setfill('0') << std::hex << distribution(gernator); // 注意每次使用都要设置
        if (i == 3 || i == 5 || i == 7)
            ss << "-"; // 设置格式 8位 - 4位 - 4位 - 序号
    }
    static std::atomic<int> cnt(1);
    size_t n = cnt.fetch_add(1); // 每次自增1
    for (int i = 7; i >= 0; i--)
    {
        ss << std::setw(2) << std::setfill('0') << std::hex << ((n >> (i * 8)) & 0xff);
        if (i == 6)
            ss << "-";
    }
    return ss.str();
}
// 需要生成8个0~255之间的随机数, 这8个都用机器生成的随机数效率太低;
// 解决: 每次调用时只生成一个随机数(机器), 然后根据这个随机数作为种子生成8个伪随机数
// 也可以近似达到随机
int main() 
{
    // std::random_device rd;
    // size_t num = rd(); // 生成机器随机数, 效率较低
    // // 通过机器随机数作为生成伪随机数种子,
    // std::mt19937_64 gernator(rd());
    // // 限制数字范围
    // std::uniform_int_distribution<int> distribution(0, 255);
    // // 将生成的数转化为16进制的数字
    // std::stringstream ss; // ss << std::hex 设置流状态, 将数字格式化为16进制
    // // ss << std::setw(2) << std::setfill('0'); // 位宽设置为2, 不足2位填充0
    // // ss << std::hex << distribution(gernator);
    // for (int i = 0; i < 8; i++)
    // {
    //     ss << std::setw(2) << std::setfill('0') << std::hex << distribution(gernator); // 注意每次使用都要设置
    //     if(i == 3 || i == 5 || i == 7) ss << "-"; // 设置格式 8位 - 4位 - 4位 - 序号
    // }
    // std::atomic<int> cnt(1);
    // size_t n = cnt.fetch_add(1); // 每次自增1
    // for(int i = 7; i >= 0; i--)
    // {
    //     ss << std::setw(2) << std::setfill('0') << std::hex << ((n >> (i * 8)) & 0xff);
    //     if (i == 6) ss << "-";
    // }
    for(int i = 0; i < 20; i++)
    {
        std::cout << uuid() << std::endl;
    }
    
    return 0;
}